<?php

function rigeneraCodice($idSetDati) {
	global $objDB;
	global $sDBG;
	$msg = '';
	$sSql = "DELETE FROM rgl_def_dato_ref WHERE id_set_dati = ".$idSetDati;
	$objDB->exec($sSql);
	$sSql = "UPDATE rgl_def_dato SET livello = 0 WHERE id_set_dati = ".$idSetDati;
	$objDB->exec($sSql);
	$nn=0;
	$aRef = array();
	$sSql = "SELECT d.* FROM rgl_def_dato d "
		." WHERE d.id_set_dati = ".$idSetDati;
	//dbg_($sSql);
	$objDB->exec($sSql,'selScript');
	while ($acX=$objDB->fetch('selScript')) {
		$phpCode = '';
		$aVarScript = array();
		$script = trim($acX['script']);
		if ($acX['flag_quad_calc'] == 'totsub') {
			$sSql = "SELECT cod_dato FROM rgl_def_dato "
				." WHERE cod_dato_padre = '".$acX['cod_dato']."'"
				." AND id_set_dati = ".$idSetDati;
			$objDB->exec($sSql,'selSubDat');
			$script = "// generato da flag_quad_calc == 'totsub'\r\n";
			$script .= "CAL Q_".$acX['cod_dato']." = 0";
			while($acSD = $objDB->fetch('selSubDat')) {
				$script .= " + Q_".$acSD['cod_dato'];
			}
		}
		if ($script != '') {
			$nomeFunz = 'rglScrDato'.$acX['cod_dato'];
			$objParser = new rglParser;
			if(!$objParser->parse($script)) {
				$msg .= $objParser->getError()."<br>";
				continue;
			}
			$phpCode = $objParser->getPHPCode($nomeFunz);
			$sSql = "UPDATE rgl_def_dato SET script = '".addslashes($script)."'"
				.", script_php = '".addslashes($phpCode)."'"
				." WHERE id_set_dati = ".$acX['id_set_dati']." AND cod_dato = '".addslashes($acX['cod_dato'])."'";
			$objDB->exec($sSql);
			$aVarScript = $objParser->aVariables;
			$nn++;
		}
		foreach($aVarScript as $varX => $aVX) {
			$sSql = "INSERT IGNORE INTO rgl_def_dato_ref "
				." (id_set_dati,cod_dato,cod_dato_ref,lett_modi) "
				." values(".$idSetDati.",'".$acX['cod_dato']."','".substr($varX,2)."','"
				.(($aVX['modified'])?'modi':'lett')."')";
			$objDB->exec($sSql);
			if ($acX['cod_dato']!=substr($varX,2)) {
				$aRef[$acX['cod_dato']][] = substr($varX,2);
			}
		}
	}
	foreach($aRef as $dl => $dr) {
		$sDBG = '';
		$liv = scanDatiRight($dl, 1, $aRef);
		//dbg_("$dl($liv) : $sDBG");
		$sSql = "UPDATE rgl_def_dato SET livello = $liv "
			." WHERE cod_dato = '$dl'"
			." AND id_set_dati = ".$idSetDati;
		$objDB->exec($sSql);
	}
	return $msg._t("generato codice per $nn script");
}

function scandatiRight($d,$liv, &$aRef) {
	global $sDBG;
	if ($liv > 20) {
		$sDBG .= "$d($liv) ";
		return $liv;
	}
	if (!isset($aRef[$d])) {
		$sDBG .= "$d($liv) ";
		return $liv;
	}
	$livMax = 0;
	foreach($aRef[$d] as $kX => $dX) {
		$livX = scanDatiRight($dX,$liv+1,$aRef);
		if ($livX > $livMax) $livMax = $livX;
	}
	$sDBG .= "$d($livMax) ";
	return $livMax;
}
